import { promisify } from "util";

// node.js进程
process

// 参数相关
const {argv,argv0,execArgv,execPath} = process;

argv
/* 
    启动process时的参数 
    返回值：[node安装路劲,当前执行文件路劲，[命令行传入的参数]...]
    例子：
        node api.js  a=1 b=2
        返回  [node,...api.js,a=1,b=2]
*/

argv0
/* 
    argv对象第一值的引用，返回Node安装路劲
*/

execArgv
/* 
    读取在node和文件名之间的参数
    例子：
        node --a api.js
        返回  ['--a']
*/

execPath
/* 
    调用脚本的路劲
*/


// 环境相关
const {env} = process;

env
/* 
    系统环境信息
*/


process.cwd()
/* 
    打印当前process的执行路径
*/

setImmediate(callback)
/* 
    global对象下，在同步动作全部执行完成之后执行的定时器
    把自己放到下个事件队列队首
*/

setTimeout(callback,time)
/* 
    比nextTick慢，比setImmediate快
    把自己放到当前队列末和下个队列首中间
*/

process.nextTick(callback)
/* 
    在同步动作执行完成后执行，比setTmmediate和setTimeout执行要早
    把自己放在当前队列末，用这个的时候需要慎重
    如果在nextTick中写入循环或者长时间执行的东西，那么会阻塞后面的事件
    一般情况下使用setImmediate就可以
    例子：
        setImmediate(()=>{
            console.log('setImmediate');
        })

        setTimeout(()=>{
            console.log('timeout');
        })

        process.nextTick(()=>{
            console.log('nextTick');
        })

        执行结果:  nextTick -> timeout -> setImmediate;
*/



// 调试
// 方法一：node 自带inspect 使用chrome调试
inspect
/* 
    参数：
        -brk  可以在开始时停下来
    1.在chrome中打开chrome://inspect
    2.点开需要调试的文件
*/

// 方法二：使用vs code 调试
/* 
    在vs code代码行前加红点为断点，在蜘蛛里调试
*/

// path模块
path
/*  
    normalize join resolve
    basename extname dirname
    parse format
    sep delimiter win32 posix

    normalize:规范化文件路径
    join:拼接文件路径
    resolve:会把文件当前路径解析成绝对路径

    basename:文件名
    dirname:父级文件名/路径
    extname:文件扩展名

    parse:分析路径，出现路径详细参数
    format:把parse出来的对象还原成路径   如果dir存在，root会被忽略   如果base存在,name和ext会被忽略

    sep:路径片段分隔符
    delimiter:路径分隔符
    win32:同一调用win系统下的方法
    posix:同一调用posix下的方法

    详细api见 http://nodejs.cn/api/path.html
*/

/* 
    path:
    __dirname,__filename  总是返回文件的绝对路径
    process.cwd()         总是返回Node命令所在的文件夹，在哪执行node命令就返回哪

    ./
    在require方法中总是相对于当前文件所在的文件夹
    在其他地方和process.cwd()一样，相对node启动文件夹
*/

buffer
/* 
    Buffer用于处理二进制数据流
    实例类似整数数组，大小固定
    c++代码在v8堆外分配物理内存
    长度在创建时确定，无法修改
*/

// buffer 实例化方法   详细api见http://nodejs.cn/api/buffer.html
Buffer.alloc(size,fill)
/* 
    size <integer> 新建的 Buffer 期望的长度
    fill <string> | <Buffer> | <integer> 用来预填充新建的 Buffer 的值。 默认: 0
*/

Buffer.allocUnsafe(size)
/* 
    size <integer> 新建的 Buffer 期望的长度
    分配一个大小为 size 字节的新建的 Buffer 。如果 size 为 0，则创建一个长度为 0 的 Buffer。
    以这种方式创建的 Buffer 实例的底层内存是未初始化的。 新创建的 Buffer 的内容是未知的，且可能包含敏感数据。 可以使用 buf.fill(0) 初始化 Buffer 实例为0。
*/

Buffer.from(obj)
/* 
    通过一个obj来创建Buffer,长度为obj长度，内容为obj内容;
*/


// buffer 类方法
Buffer.byteLength(string)
/* 
    string:字符串
    返回一个字符串的实际字节长度。
*/

Buffer.isBuffer(obj)
/* 
    obj:对象
    判断一个对象是不是一个buffer对象。
*/

Buffer.concat(array)
/* 
    拼接array中的Buffer
*/

// buf 实例方法
buf.length
/* 
    buf的字节数，申请时为多少就是多少
*/

buf.toString([confing])
/* 
    参数：
        [confing]:可选择编码格式
    用途：
        把buf转化为字符串，默认为utf-8格式
*/

buf.fill(val,[start,end])
/* 
    参数：
        val:用来填充buf的值
        [start]:填充buf的起始位
        [end]:填充buf的结束位
        如果未指定 start 和 end，则填充整个 buf
    用途：
        填充buf实例
*/

buf.equals(buf2)
/* 
    参数：
        buf2：另一个buf
    用途：
        比较两个buf的内容是否一样
    返回值：Blone
*/



fs模块

fs.readFile(path,callback)
/* 
    参数：
        path:文件的路径
    用途：
        读取文件
    返回值：文件Buffer，回调中返回
*/

fs.writeFile(path,options,callback)
/* 
    参数：
        path:文件路径，可以带文件名
    用途：
        写入文件
*/

fs.stat(path,callback)
/* 
    参数：
        path：文件路径
        callback:回调函数
    用途：读取文件信息，可以用于检查文件是否存在
    返回值：文件信息，在回调中返回
*/


fs.rename(path,callback)
/* 
    参数：
        path:文件路径
    用途：修改文件名字
*/

fs.unlink(path,callback)
/* 
    参数：
        path:文件路径
    用途：
        删除文件
*/

fs.readdir(path,callback)
/* 
    参数：
        path：文件路径
    用途：
        读取目录下的文件名
    返回值：
        array：包含路径目录下所有文件名
*/

fs.mkdir(path,callback)
/* 
    参数：
        path：文件路径
    用途：
        创建文件夹
*/

fs.rmdir(path,callback)
/* 
    参数：
        path:文件路径
    用途：删除文件夹
*/

fs.watch(path,options,callback)
/* 
    参数：
        path:路径
        options:
            recursive:true    是否递归，是否监视文件夹下的子文件夹
        callback:
            eventType: 文件发生改变的事件类型
            filename : 发生改名的文件名称
    用途：
        监控一个文件或文件夹，如果文件内容有变动的话执行回调函数
*/



.gitignore规则

/* 
    匹配模式前 / 代表项目根目录
    匹配模式后 / 代表是目录
    匹配模式前加 ! 代表取反
    *代表任意一个字符
    ?表示匹配一个字符
    **匹配多级目录
*/

// 解决回调地狱问题
const promisify = require('util').promisify;
